//package com.ruoyi.system.service.MQTT;
//
//import cn.hutool.core.collection.IterUtil;
//import cn.hutool.core.date.DateUnit;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.CharsetUtil;
//import cn.hutool.http.webservice.SoapClient;
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil;
//import cn.hutool.json.XML;
//import com.alibaba.fastjson.JSON;
//import com.ruoyi.common.utils.spring.SpringUtils;
//import com.ruoyi.system.domain.InterfaceLog;
//import com.ruoyi.system.domain.MES.*;
//import com.ruoyi.system.mapper.InterfaceLogMapper;
//import com.ruoyi.system.mapper.MES.*;
//import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
//import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
//import org.eclipse.paho.client.mqttv3.MqttException;
//import org.eclipse.paho.client.mqttv3.MqttMessage;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.annotation.Transactional;
//
//import javax.xml.soap.SOAPElement;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//
///**
// * @description: https://blog.csdn.net/qq_42862247/article/details/125536672
// * @author: zhengxiong.jiang
// * @createDate: 2023/3/22
// * @version: 1.0
// */
//public class MyMQTTCallback implements MqttCallbackExtended {
//    //手动注入
//    private MqttConfiguration mqttConfiguration = SpringUtils.getBean(MqttConfiguration.class);
//
//    private InterfaceLogMapper interfaceLogMapper = SpringUtils.getBean(InterfaceLogMapper.class);
//
//    private KeymatBindMapper keymatBindMapper = SpringUtils.getBean(KeymatBindMapper.class);
//
//    private MaterialDatasMapper datasMapper = SpringUtils.getBean(MaterialDatasMapper.class);
//
//    private DataCollectionMapper dataCollectionMapper = SpringUtils.getBean(DataCollectionMapper.class);
//
//    private DataCollectionInfoMapper dataCollectionInfoMapper = SpringUtils.getBean(DataCollectionInfoMapper.class);
//
//    private MesAralmMapper mesAralmMapper = SpringUtils.getBean(MesAralmMapper.class);
//
//    private static final Logger log = LoggerFactory.getLogger(MyMQTTCallback.class);
//
//    private MyMQTTClient myMQTTClient;
//
//    public MyMQTTCallback(MyMQTTClient myMQTTClient) {
//        this.myMQTTClient = myMQTTClient;
//    }
//
//
//    /**
//     * 丢失连接，可在这里做重连
//     * 只会调用一次
//     *
//     * @param throwable
//     */
//    @Override
//    public void connectionLost(Throwable throwable) {
//        log.error("mqtt connectionLost 连接断开，5S之后尝试重连: {}", throwable.getMessage());
//        long reconnectTimes = 1;
//        while (true) {
//            try {
//                if (MyMQTTClient.getClient().isConnected()) {
//                    //判断已经重新连接成功  需要重新订阅主题 可以在这个if里面订阅主题  或者 connectComplete（方法里面）  看你们自己选择
//                    log.warn("mqtt reconnect success end  重新连接  重新订阅成功");
//                    return;
//                }
//                reconnectTimes+=1;
//                log.warn("mqtt reconnect times = {} try again...  mqtt重新连接时间 {}", reconnectTimes, reconnectTimes);
//                MyMQTTClient.getClient().reconnect();
//            } catch (MqttException e) {
//                log.error("mqtt断连异常", e);
//            }
//            try {
//                Thread.sleep(5000);
//            } catch (InterruptedException e1) {
//            }
//        }
//    }
//
//    /**
//     * @param topic
//     * @param mqttMessage
//     * @throws Exception
//     * subscribe后得到的消息会执行到这里面
//     */
//    @Override
//    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
//        log.info("接收消息主题 : {}，接收消息内容 : {}", topic, new String(mqttMessage.getPayload()));
//        //发布消息主题
//        Map maps = (Map) JSON.parse(new String(mqttMessage.getPayload(), CharsetUtil.UTF_8));
//        //你自己的业务接口
//        this.insertCmdResults(maps,topic);
//        //接收其他主题
//    }
//
//
//
//
//
//    private void insertCmdResults(Map maps,String topic) {
//        String anInterface = (String) maps.get("Interface");
//        //业务逻辑处理
//        if("MES_to_MOM".equals(topic)){
//
//            if("KEYMAT_BIND".equals(anInterface)){//todo 关键物料绑定
//                Object body = maps.get("Body");
//                KeymatBindDTO keymatBindDTO = JSONUtil.toBean(JSONUtil.toJsonStr(body), KeymatBindDTO.class);
//                KeymatBind keymatBind = new KeymatBind();
//                BeanUtils.copyProperties(keymatBindDTO,keymatBind);
//                try{
//                    keymatBindMapper.insert(keymatBind);
//                }catch (Exception e){
//                    e.printStackTrace();
//                }
//                List<MaterialDatasDTO> materialList = keymatBindDTO.getMaterialList();
//                if(IterUtil.isNotEmpty(materialList)){
//                    materialList.stream().forEach(i->{
//                        MaterialDatas materialDatas = new MaterialDatas();
//                        BeanUtils.copyProperties(i,materialDatas);
//                        materialDatas.setBindId(keymatBind.getBindId());
//                        try{
//                            datasMapper.insert(materialDatas);
//                        }catch (Exception e){
//                            e.printStackTrace();
//                        }
//
//                        //进行华为父子条码追溯信息接口发送
////                        this.sendHuaweitmzs(i,keymatBind);
//
//                    });
//                }
//
//            }else if ("DATA_COLLECTION".equals(anInterface)){// todo 过站信息
//
//                Object body = maps.get("Body");
//                DataCollection dataCollection = JSONUtil.toBean(JSONUtil.toJsonStr(body), DataCollection.class);
//                try{
//                    dataCollectionMapper.insert(dataCollection);
//                }catch (Exception e){
//                    e.printStackTrace();
//                }
//                List<DataCollectionInfo> dataList = dataCollection.getDataList();
//                for (int i = 0; i < dataList.size(); i++) {
//                    dataList.get(i).setCollectionId(dataCollection.getCollectionId());
//                    try {
//                        dataCollectionInfoMapper.insert(dataList.get(i));
//                    }catch (Exception e){
//                        e.printStackTrace();
//                    }
//                }
//
//            }else if("MESSAGE_PUSHING".equals(anInterface)){// todo 告警信息
//                Object body = maps.get("Body");
//                MesAralmDTO mesAralmDTO = JSONUtil.toBean(JSONUtil.toJsonStr(body), MesAralmDTO.class);
//                MesAralm mesAralm = new MesAralm();
//                BeanUtils.copyProperties(mesAralmDTO,mesAralm);
//                try {
//                    mesAralmMapper.insert(mesAralm);
//                }catch (Exception e){
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//    /**
//     * 请求华为父子条码追溯接口 webservice
//     * @param dto
//     * @param keymatBind
//     */
//    private void sendHuaweitmzs(MaterialDatasDTO dto, KeymatBind keymatBind) {
//
//        //接口日志记录
//        InterfaceLog interfaceLog = new InterfaceLog();
//        interfaceLog.setSerialNumber(String.valueOf(new Date().getTime()));
//        interfaceLog.setStartTime(new Date());
//        interfaceLog.setInterfaceDirection("MOM->HUAWEI");
//        interfaceLog.setPacketSize("");
//        interfaceLog.setInterfaceType("webservice");
//        interfaceLog.setEndTime(new Date());
//        long be = DateUtil.between(interfaceLog.getStartTime(), interfaceLog.getEndTime(), DateUnit.SECOND);
//        interfaceLog.setTimeConsuming(String.valueOf(be));
//        interfaceLog.setCreateTime(new Date());
//
//
//        SoapClient client = SoapClient.create("http://cmes.huawei.com/hw_manufacture/MidLayer.asmx")
//                .setMethod("Get_Info_Frmbarcode", "http://Auto.huawei.com.cn/")
//                .setParam("sTaskType", "BarcodeRelationSend");
//        try{
//            SOAPElement sImport = client.getMethodEle().addChildElement("sImport");
//            sImport.addChildElement("PO").setValue("111");
//            sImport.addChildElement("VendorID").setValue("111");
//            sImport.addChildElement("ORGID").setValue("111");
//            sImport.addChildElement("ItemCode").setValue("111");
//            sImport.addChildElement("Barcode").setValue("111");
//            sImport.addChildElement("SonBarcode").setValue("111");
//            sImport.addChildElement("SonItemCode").setValue("111");
//            sImport.addChildElement("Quantity").setValue("111");
//            sImport.addChildElement("Supplier").setValue("111");
//            sImport.addChildElement("Manufactory").setValue("111");
//            sImport.addChildElement("UploadFlag").setValue("111");
//            sImport.addChildElement("CheckMessage").setValue("111");
//            sImport.addChildElement("CreatedBy").setValue("111");
//            sImport.addChildElement("CreatedDate").setValue("111");
//            sImport.addChildElement("UpdatedBy").setValue("111");
//            sImport.addChildElement("UpdatedDate").setValue("111");
//            sImport.addChildElement("Segment1").setValue("111");
//            sImport.addChildElement("Segment2").setValue("111");
//            sImport.addChildElement("Segment3").setValue("111");
//            sImport.addChildElement("Segment4").setValue("111");
//            sImport.addChildElement("Segment5").setValue("111");
//            sImport.addChildElement("Segment6").setValue("111");
//            sImport.addChildElement("Segment7").setValue("111");
//            sImport.addChildElement("ItemID").setValue("111");
//            sImport.addChildElement("SonItemID").setValue("111");
//            sImport.addChildElement("CheckFlag").setValue("111");
//            sImport.addChildElement("EmsTransID").setValue("111");
//            sImport.addChildElement("CheckInfo").setValue("111");
//            sImport.addChildElement("Segment8").setValue("111");
//            sImport.addChildElement("Segment9").setValue("111");
//            sImport.addChildElement("Segment10").setValue("111");
//            sImport.addChildElement("Segment11").setValue("111");
//            sImport.addChildElement("Segment12").setValue("111");
//            sImport.addChildElement("Segment13").setValue("111");
//            sImport.addChildElement("Segment14").setValue("111");
//            sImport.addChildElement("Segment15").setValue("111");
//
//            interfaceLog.setInterfaceRequest(JSONUtil.toJsonStr(sImport));
//
//            // 发送请求，参数true表示返回一个格式化后的XML内容
//            // 返回内容为XML字符串，可以配合XmlUtil解析这个响应
//            String send = client.send(true);
//
//            JSONObject object = XML.toJSONObject(send);
//            Map map = JSONUtil.toBean(JSONUtil.toJsonStr(object), Map.class);
//            System.out.println(JSONUtil.toJsonStr(object));
//            interfaceLog.setInterfaceResponse(JSONUtil.toJsonStr(object));
//        }catch (Exception e){
//            interfaceLog.setInterfaceResponse("上传条码父子项对应关系接口失败失败原因："+e.getMessage());
//        }
//        interfaceLogMapper.insert(interfaceLog);
//    }
//
//    /**
//     *连接成功后的回调 可以在这个方法执行 订阅主题  生成Bean的 MqttConfiguration方法中订阅主题 出现bug
//     *重新连接后  主题也需要再次订阅  将重新订阅主题放在连接成功后的回调 比较合理
//     * @param reconnect
//     * @param serverURI
//     */
//    @Override
//    public  void  connectComplete(boolean reconnect,String serverURI){
//        log.info("MQTT 连接成功，连接方式：{}",reconnect?"重连":"直连");
//        //订阅主题
////        myMQTTClient.subscribe(mqttConfiguration.topic1, 1);
////        myMQTTClient.subscribe(mqttConfiguration.topic2, 1);
//        myMQTTClient.subscribe(mqttConfiguration.topic3, 1);
////        myMQTTClient.subscribe(mqttConfiguration.topic4, 1);
//    }
//
//    /**
//     * 消息到达后
//     * subscribe后，执行的回调函数
//     *
//     * @param s
//     * @param mqttMessage
//     * @throws Exception
//     */
//    /**
//     * publish后，配送完成后回调的方法
//     *
//     * @param iMqttDeliveryToken
//     */
//    @Override
//    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
//        log.info("==========deliveryComplete={}==========", iMqttDeliveryToken.isComplete());
//    }
//}
